#ifndef SSD1306_H
#define SSD1306_H

#include <stdint.h>
#include "iot_gpio.h"

// SSD1306配置参数
#define SSD1306_I2C_ADDR        0x3C    // SSD1306 I2C地址
#define SSD1306_WIDTH           128     // 显示宽度
#define SSD1306_HEIGHT          64      // 显示高度
#define SSD1306_BUFFER_SIZE     (SSD1306_WIDTH * SSD1306_HEIGHT / 8)

// 软件I2C引脚定义
#define SSD1306_SCL_PIN         1       // IO01 作为SCL
#define SSD1306_SDA_PIN         0       // IO00 作为SDA

// SSD1306命令
#define SSD1306_CMD_SET_CONTRAST        0x81
#define SSD1306_CMD_DISPLAY_ALL_ON_RESUME   0xA4
#define SSD1306_CMD_DISPLAY_ALL_ON      0xA5
#define SSD1306_CMD_NORMAL_DISPLAY      0xA6
#define SSD1306_CMD_INVERT_DISPLAY      0xA7
#define SSD1306_CMD_DISPLAY_OFF         0xAE
#define SSD1306_CMD_DISPLAY_ON          0xAF
#define SSD1306_CMD_SET_DISPLAY_OFFSET  0xD3
#define SSD1306_CMD_SET_COM_PINS        0xDA
#define SSD1306_CMD_SET_VCOM_DETECT     0xDB
#define SSD1306_CMD_SET_DISPLAY_CLOCK_DIV   0xD5
#define SSD1306_CMD_SET_PRECHARGE       0xD9
#define SSD1306_CMD_SET_MULTIPLEX       0xA8
#define SSD1306_CMD_SET_LOW_COLUMN      0x00
#define SSD1306_CMD_SET_HIGH_COLUMN     0x10
#define SSD1306_CMD_SET_START_LINE      0x40
#define SSD1306_CMD_MEMORY_MODE         0x20
#define SSD1306_CMD_COLUMN_ADDR         0x21
#define SSD1306_CMD_PAGE_ADDR           0x22
#define SSD1306_CMD_COM_SCAN_INC        0xC0
#define SSD1306_CMD_COM_SCAN_DEC        0xC8
#define SSD1306_CMD_SEG_REMAP           0xA0
#define SSD1306_CMD_CHARGE_PUMP         0x8D
#define SSD1306_CMD_EXTERNAL_VCC        0x10
#define SSD1306_CMD_SWITCH_CAP_VCC      0x14

// 表情类型定义
typedef enum {
    FACE_SMILE = 0,     // 笑脸
    FACE_NEUTRAL,       // 中性表情
    FACE_ANGRY,         // 生气表情
    FACE_SURPRISED,     // 惊讶表情
    FACE_SLEEPY,        // 睡觉表情
    FACE_HEART          // 心形表情
} FaceType;

// 函数声明
void SSD1306_Init(void);
void SSD1306_Clear(void);
void SSD1306_Display(void);
void SSD1306_DrawPixel(uint8_t x, uint8_t y, uint8_t color);
void SSD1306_DrawFace(FaceType face);
void SSD1306_SetContrast(uint8_t contrast);
void SSD1306_InvertDisplay(uint8_t invert);

#endif // SSD1306_H 